package com.binhthuan.catechist.server.domain;

import java.util.Date;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;

import com.google.gson.annotations.Expose;

/**
 * @author Giang Đinh - Tài khoản người dùng, tương ứng với bảng
 *         <b>ec_account</b> trong cơ sở dữ liệu.
 */
@Entity
@Table(name="ec_account")
public class Account extends AbstractObject {

    /**
     * Mã tài khoản.
     */
    @Id
    @Column(name="trainer_id")
    @Expose
    private Integer id;
    
    /**
     * Giáo lý viên sở hữu tài khoản.
     */
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @PrimaryKeyJoinColumn(name="trainer_id", referencedColumnName="person_id")
    @Expose
    private Trainer trainer;

    /**
     * Tên đăng nhập.
     */
    @Column(name="username", length=20)
    @Expose
    private String username;

    /**
     * Mật khẩu.
     */
    @Column(name="password", length=50)
    @Expose
    private String password;

    /**
     * Câu hỏi bảo mật.
     */
    @Column(name="security_question", length=50)
    @Expose
    private String securityQuestion;

    /**
     * Trả lời cho câu hỏi bảo mật.
     */
    @Column(name="security_answer", length=50)
    @Expose
    private String securityAnswer;

    /**
     * Thời gian đăng nhập lần cuối.
     */
    @Column(name="last_login_date")
    @Expose
    private Date lastLoginDate;

    /**
     * IP dùng để đăng nhập lần cuối.
     */
    @Column(name="last_login_ip", length=15)
    @Expose
    private String lasLoginIP;

    /**
     * Trạng thái của tài khoản (bị khóa hay không).
     */
    @Column(name="is_locked")
    @Expose
    private Boolean locked;

    /**
     * Trạng thái của tài khoản (được kích hoạt hay chưa).
     */
    @Column(name="is_active")
    @Expose
    private Boolean active;

    public Account() {

    }

    /**
     * Lấy mã tài khoản.
     * @return Mã tài khoản.
     */
    public Integer getId() {
        return id;
    }

    /**
     * Gán mã tài khoản.
     * @param id
     *            Mã tài khoản.
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * Lấy người sở hữu tài khoản.
     * @return Giáo lý viên sở hữu tài khoản.
     */
    public Trainer getTrainer() {
        return trainer;
    }

    /**
     * Gán người sở hữu tài khoản.
     * @param trainer
     *            Giáo lý viên sở hữu tài khoản.
     */
    public void setTrainer(Trainer trainer) {
        this.trainer = trainer;
    }

    /**
     * Lấy tên đăng nhập.
     * @return Tên đăng nhập.
     */
    public String getUsername() {
        return username;
    }

    /**
     * Gán tên đăng nhập.
     * @param username
     *            Tên đăng nhập.
     */
    public void setUsername(String username) {
        this.username = username;
    }

    /**
     * Lấy mật khẩu.
     * @return Mật khẩu.
     */
    public String getPassword() {
        return password;
    }

    /**
     * Gán mật khẩu.
     * @param password
     *            Mật khẩu.
     */
    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * Lấy câu hỏi bảo mật.
     * @return Câu hỏi bảo mật.
     */
    public String getSecurityQuestion() {
        return securityQuestion;
    }

    /**
     * Gán câu hỏi bảo mật.
     * @param securityQuestion
     *            Câu hỏi bảo mật.
     */
    public void setSecurityQuestion(String securityQuestion) {
        this.securityQuestion = securityQuestion;
    }

    /**
     * Lấy câu trả lời cho câu hỏi bảo mật.
     * @return Câu trả lời cho câu hỏi bảo mật.
     */
    public String getSecurityAnswer() {
        return securityAnswer;
    }

    /**
     * Gán câu trả lời cho câu hỏi bảo mật.
     * @param securityAnswer
     *            Câu trả lời cho câu hỏi bảo mật.
     */
    public void setSecurityAnswer(String securityAnswer) {
        this.securityAnswer = securityAnswer;
    }

    /**
     * Lấy ngày đăng nhập lần cuối.
     * @return Ngày đăng nhập lần cuối.
     */
    public Date getLastLoginDate() {
        return lastLoginDate;
    }

    /**
     * Gán ngày đăng nhập lần cuối.
     * @param lastLoginDate
     *            Ngày đăng nhập lần cuối.
     */
    public void setLastLoginDate(Date lastLoginDate) {
        this.lastLoginDate = lastLoginDate;
    }

    /**
     * Lấy IP dùng để đăng nhập lần cuối.
     * @return IP dùng để đăng nhập lần cuối.
     */
    public String getLasLoginIP() {
        return lasLoginIP;
    }

    /**
     * Gán IP dùng để đăng nhập lần cuối.
     * @param lasLoginIP
     *            IP dùng để đăng nhập lần cuối.
     */
    public void setLasLoginIP(String lasLoginIP) {
        this.lasLoginIP = lasLoginIP;
    }

    /**
     * Kiểm tra tài khoản có bị khóa hay không.
     * @return <b>true</b> - Tài khoản bị khóa.
     */
    public Boolean isLocked() {
        return locked;
    }
    
    /**
     * Kiểm tra tài khoản có bị khóa hay không.
     * @return <b>true</b> - Tài khoản bị khóa.
     */
    public Boolean getLocked() {
        return locked;
    }

    /**
     * Gán trạng thái cho tài khoản
     * @param locked
     *            Trạng thái khóa của tài khoản.
     */
    public void setLocked(Boolean locked) {
        this.locked = locked;
    }

    /**
     * Lấy trạng thái được kích hoạt của tài khoản.
     * @return the active
     */
    public Boolean getActive() {
        return active;
    }

    /**
     * Kích hoạt tài khoản.
     * @param active
     */
    public void setActive(Boolean active) {
        this.active = active;
    }
}
